home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-10-06 | 9.2 KB | 411 lines | [TEXT/MPCC] |
- // ===========================================================================
- // LServerChooser.cp A window for selecting a NetWare server
- // ===========================================================================
- //
- // This program is NOT necessarily the model of good programming. The attention
- // has been spent on the server side. However, if you wish to use this
- // as a starter program, feel free.
- //
- // This program was written with Metrowerks C/C++ for 68k, using the
- // PowerPlant class hierarchy.
- //
- // It was written by Nick Brosnahan and Jamie Osborne. 9/94
- //
- // Apple Computer, Inc. makes no warranties about the the fitness of this code
- // for any purpose and will not be held liable for any damages you may suffer
- // from using this code. Furthermore, Apple Computer, Inc. will not be held
- // liable for the death of Elvis or any other space alien.
- //
- // Your mileage may vary.
-
- #include "LServerChooser.h"
- #include "NLMClientApp.h"
- #include "NetLister.h"
- #include <LStdControl.h>
- #include <LCaption.h>
- #include <LEditField.h>
- #include <PP_Messages.h>
-
- #ifndef __TYPES__
- #include <Types.h>
- #endif
-
- #ifndef __PACKAGES__
- #include <Packages.h>
- #endif
-
- #include <stdlib.h>
- #include <stdio.h>
-
- // additions
-
- #include <string.h>
-
- const ResIDT WIND_ServerActions = 1001;
- const MessageT msg_ZoneChosen = 2001;
-
- extern NLMClientApp *gApplication;
-
- // ---------------------------------------------------------------------------
- // • CreateAppWindowStream [static]
- // ---------------------------------------------------------------------------
- // Return a new AppWindow object initialized using data from a Stream
-
- LServerChooser*
- LServerChooser::CreateServerChooserStream(
- LStream *inStream)
- {
- return (new LServerChooser(inStream));
- }
-
-
- // ---------------------------------------------------------------------------
- // • LServerChooser
- // ---------------------------------------------------------------------------
- // Default Constructor
-
- LServerChooser::LServerChooser()
- {
- mZoneCounter = mServerCounter = 0;
- }
-
-
- // ---------------------------------------------------------------------------
- // • LServerChooser(SWindowInfo&)
- // ---------------------------------------------------------------------------
- // Construct DialogBox from the data in a struct
-
- LServerChooser::LServerChooser(
- SWindowInfo &inWindowInfo)
- : LDialogBox(inWindowInfo)
- {
- mZoneCounter = mServerCounter = 0;
- }
-
-
- // ---------------------------------------------------------------------------
- // • LServerChooser(ResIDT, Uint32, LCommander*)
- // ---------------------------------------------------------------------------
- // Construct a DialogBox from a WIND Resource with the specified attributes
- // and SuperCommander
- //
- // Side Effect: Created window becomes the current port
-
- LServerChooser::LServerChooser(
- ResIDT inWINDid,
- Uint32 inAttributes,
- LCommander *inSuper)
- : LDialogBox(inWINDid, inAttributes, inSuper)
- {
- mZoneCounter = mServerCounter = 0;
- }
-
-
- // ---------------------------------------------------------------------------
- // • LServerChooser(LStream*)
- // ---------------------------------------------------------------------------
- // Construct a DialogBox from the data in a Stream
-
- LServerChooser::LServerChooser(
- LStream *inStream)
- : LDialogBox(inStream)
- {
- mZoneCounter = mServerCounter = 0;
- }
-
-
- // ---------------------------------------------------------------------------
- // • ~LServerChooser
- // ---------------------------------------------------------------------------
- // Destructor
-
- LServerChooser::~LServerChooser()
- {
- if (zoneList)
- {
- free(zoneList);
- CloseZoneList();
- }
- if (serverList)
- {
- free(serverList);
- CloseNBPList();
- }
- }
-
- void LServerChooser::ListenToMessage(
- MessageT inMessage,
- void *ioParam)
- {
- LServerActions *serverActions = NULL;
- Cell firstCell;
- firstCell.h = 0;
- firstCell.v = 0;
-
- switch (inMessage)
- {
- case msg_OK:
- serverActions = DoOKHit();
- if (serverActions)
- {
- DoClose();
- serverActions->Show();
- serverActions->DoClient();
- }
- break;
- case msg_Cancel:
- DoClose();
- break;
- case msg_ZoneChosen:
- RefreshServerList();
- break;
- default:
- if (GetSuperCommander() != nil)
- GetSuperCommander()->ProcessCommand(inMessage, ioParam);
- break;
- }
- }
-
- void LServerChooser::DoSetupServerChooser()
- {
- DoSetupZoneList();
-
- DoSetupServerList();
-
- mOKButton = (LStdButton *)this->FindPaneByID('okay');
- mOKButton->SetValueMessage(msg_OK);
- mOKButton->AddListener(this);
-
- mCancelButton = (LStdButton *)this->FindPaneByID('cncl');
- mCancelButton->SetValueMessage(msg_Cancel);
- mCancelButton->AddListener(this);
-
- this->SetDefaultButton (mOKButton->GetPaneID());
-
- Show();
- StartIdling();
- }
-
- void LServerChooser::DoSetupZoneList()
- {
- short i;
- Cell selectedCell;
- Str255 currentZone;
-
- mZonesList = (LListBox *)this->FindPaneByID('zone');
- mZonesList->SetDoubleClickMessage(msg_ZoneChosen);
- mZonesList->AddListener(this);
-
- // Create Zone List stuff
-
- zoneList = (ZoneElem *)malloc(sizeof(ZoneElem)*400);
- OpenZoneList(zoneList, 400);
-
- numZones = ZoneListSize();
-
- LAddColumn(1, 1, mZonesList->GetMacListH());
- LAddRow(numZones, 1, mZonesList->GetMacListH());
-
- RefreshZoneList();
-
- GetMyLocalZone(localZone);
-
- for (i=0; i<numZones; i++)
- {
- selectedCell.h = 0;
- selectedCell.v = i;
-
- mZonesList->SelectOneCell(selectedCell);
- mZonesList->GetDescriptor(currentZone);
-
- if (strcmp (p2cstr(localZone), p2cstr(currentZone)) == 0)
- {
- c2pstr((char *)localZone);
- c2pstr((char *)currentZone);
- mZonesList->MakeCellVisible(selectedCell);
- break;
- }
- else
- {
- c2pstr((char *)localZone);
- c2pstr((char *)currentZone);
- }
- }
- }
-
- void LServerChooser::RefreshZoneList()
- {
- Cell selectedCell;
- short i = 0;
-
- UpdateZoneList();
-
- if (numZones < ZoneListSize())
- {
- LAddRow(ZoneListSize() - numZones, 1, mZonesList->GetMacListH());
- }
- else if (numZones > ZoneListSize())
- {
- LDelRow(numZones - ZoneListSize(), 1, mZonesList->GetMacListH());
- }
-
- numZones = ZoneListSize();
-
- for (i=0; i<numZones; i++)
- {
- selectedCell.h = 0;
- selectedCell.v = i;
-
- mZonesList->SelectOneCell(selectedCell);
- mZonesList->SetDescriptor(zoneList[i].zoneName);
- }
-
- // mZonesList->Refresh();
- }
-
- void LServerChooser::DoSetupServerList()
- {
- mServersList = (LListBox *)this->FindPaneByID('serv');
- mServersList->SetDoubleClickMessage(msg_OK);
- mServersList->AddListener(this);
-
- serverList = (NBPElem *)malloc(sizeof(NBPElem) * 100);
-
- OpenNBPList(localZone, "\pATDEMO_Server.NATIVE", serverList, 100);
-
- // Setup server pane
-
- numServers = NBPListSize();
-
- LAddColumn(1, 1, mServersList->GetMacListH());
- LAddRow(numServers, 1, mServersList->GetMacListH());
-
- }
-
- void LServerChooser::RefreshServerList()
- {
- Cell selectedCell;
- short i = 0;
- Str255 currentZone;
-
- mZonesList->GetDescriptor(currentZone);
-
- if (strcmp (p2cstr(localZone), p2cstr(currentZone)) != 0)
- {
- c2pstr((char *)localZone);
- c2pstr((char *)currentZone);
-
- LDelRow(numServers, 1, mServersList->GetMacListH());
- numServers = 0;
-
- mServersList->Refresh();
-
- CloseNBPList();
- OpenNBPList(currentZone, "\pATDEMO_Server.NATIVE", serverList, 100);
- }
- else
- {
- c2pstr((char *)localZone);
- c2pstr((char *)currentZone);
- }
-
- UpdateNBPList();
-
- if (numServers < NBPListSize())
- {
- LAddRow(NBPListSize() - numServers, 1, mServersList->GetMacListH());
- }
- else if (numServers > NBPListSize())
- {
- LDelRow(numServers - NBPListSize(), 1, mServersList->GetMacListH());
- }
-
- numServers = NBPListSize();
-
- for (i=0; i<numServers; i++)
- {
- selectedCell.h = 0;
- selectedCell.v = i;
-
- mServersList->SelectOneCell(selectedCell);
- mServersList->SetDescriptor(serverList[i].nbpName);
- }
- if (numServers && (mServersList->GetValue() != -1))
- {
- mOKButton->Enable();
- mOKButton->Refresh();
- }
- else
- {
- mOKButton->Disable();
- mOKButton->Refresh();
- }
- }
-
- void LServerChooser::SpendTime(const EventRecord &inMacEvent)
- {
- if (mServerCounter++ > 100)
- {
- mServerCounter = 0;
- RefreshServerList();
- if (mZoneCounter++ > 5)
- {
- mZoneCounter = 0;
- }
- }
- }
-
- LServerActions *LServerChooser::DoOKHit()
- {
- LServerActions *serverActions;
- ATAddress addr;
- Str32 serverName;
- Str32 zoneName;
- Cell firstCell;
- Cell selectedCell;
- firstCell.h = 0;
- firstCell.v = 0;
-
- mServersList->GetLastSelectedCell(selectedCell);
- mServersList->SelectOneCell(selectedCell);
- mServersList->GetDescriptor(serverName);
- mZonesList->GetLastSelectedCell(selectedCell);
- mZonesList->SelectOneCell(selectedCell);
- mZonesList->GetDescriptor(zoneName);
- FindServerAddress(serverName, zoneName, &addr);
- StopIdling();
-
- serverActions = (LServerActions *)LServerActions::CreateWindow(WIND_ServerActions, gApplication);
- serverActions->DoSetupServerActions(addr);
- serverActions->SetDescriptor(serverName);
-
- return serverActions;
- }
-
- void FindServerAddress(Str32 name, Str32 zone, ATAddress *addr)
- {
- MPPParamBlock pb;
- EntityName entity;
- char buff[1000];
- OSErr stat;
- EntityName ename;
-
- NBPSetEntity((Ptr)&entity, (Ptr) name, (Ptr) "\pATDEMO_Server.NATIVE", (Ptr)zone);
-
- memset(&pb, 0, sizeof(pb));
- pb.NBPentityPtr = (Ptr)&entity;
- pb.NBPretBuffPtr = buff;
- pb.NBPretBuffSize = 1000;
- pb.NBPmaxToGet = 1;
- pb.NBPinterval = 8;
- pb.NBPcount = 3;
-
- stat = PLookupName(&pb, false);
- Assert_(!stat);
-
- Assert_(pb.NBPnumGotten);
- stat = NBPExtract((Ptr)buff, pb.NBPnumGotten, 1, &ename, addr);
- Assert_(!stat);
- }
-
-